﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SisVenda.Data.Interfaces;
using System.Linq.Expressions;

namespace SisVenda.Data
{
    public abstract class AbstractCrudDao<T>:IBaseCrudDao<T> where T : class
    {
        BD_SisVendaEntities entidades = new BD_SisVendaEntities();

        //Adiciona Dados da Entidade
        public void Add(T pEntidade)
        {
            entidades.AddObject(pEntidade.GetType().Name, pEntidade);
        }

        //Deleta dados da Entidade
        public void Delete(T pEntidade)
        {
            entidades.DeleteObject(pEntidade);
        }

        public void Attach(T pEntidade)
        {
            entidades.AttachTo(pEntidade.GetType().Name, pEntidade);
        }

        public void Detach(T pEntidade)
        {
            entidades.Detach(pEntidade);
        }

        //atualiza dados da entidade 
        public void Update(T pEntidade)
        {
            entidades.ApplyCurrentValues<T>(pEntidade.GetType().Name, pEntidade);
        }

        //Busca e Retorna os Dados conforme a condição
        public IQueryable<T> Find(Expression<Func<T, bool>> where)
        {
           return entidades.CreateObjectSet<T>().Where(where);
        }

        //Busca e Retorna Todos os dados da Entidade
        public IQueryable<T> GetAll()
        {
            return entidades.CreateObjectSet<T>();
        }

        public void SaveChanges()
        {
            entidades.SaveChanges();
        }
    }
}
